import { toNumber } from '@/utils/ik/base/numberUtils'
import { toString } from '@/utils/ik/base/stringUtils'
import { addition_NumberResult, subtraction_StringResult, multiplication_StringResult, division_StringResult, division_NumberResult } from '@/utils/ik/math/mathUtils'

// 实体
export const entityScript = {
  init: function(scriptJson) {
    // 判断是否存在dtms
    if (!Object.prototype.hasOwnProperty.call(scriptJson, 'dtms')) {
      scriptJson.dtms = {}
    }
    if (!Object.prototype.hasOwnProperty.call(scriptJson['dtms'], 'sale')) {
      scriptJson.dtms.sale = entityScript
    }
  },
  // 表头样式初始化
  onInfoHeadFrameInit: function(vueObject, headFrameData) {
  },
  // 表身样式初始化
  onInfoBodyFrameInit: function(vueObject, bodyFrameData) {
  },
  // 表身新建行
  onAddBodyRow: function(vueObject, bodyName, itemData) {
  },
  // 表头改变事件，赋值时需要用this.$set(this.data,index,row)
  onHeadChange: function(vueObject, data, fieldName, oldValue, newValue) {
  },
  // 表身改变事件
  onBodyChange: function(vueObject, data, bodyName, lineNum, fieldName, oldValue, newValue) {
    //
    if (bodyName === 'saleItem') {
      // 包装数量修改时，级联主数量和数量，两个金额，税额，并汇总金额税额到表头
      if (fieldName === 'settlementNumber') {
        // 主数量
        this.resetMainNumber(vueObject, data, lineNum)
        // 金额、税额
        this.resetPrice(vueObject, data, lineNum)
        // 汇总
        this.sumPrice(vueObject, data)
      }
      // 结算单位系数修改时，级联主数量和数量，两个金额，税额，并汇总金额税额到表头
      if (fieldName === 'settlementUomCode') {
        // 主数量
        this.resetMainNumber(vueObject, data, lineNum)
        // 金额、税额
        this.resetPrice(vueObject, data, lineNum)
        // 汇总
        this.sumPrice(vueObject, data)
      }
      // 主数量修改，级联结算数量、数量、两个金额、税额，并汇总金额税额到表头
      if (fieldName === 'mainNumber') {
        // 结算数量
        this.resetSettlementNumber(vueObject, data, lineNum)
        // 金额、税额
        this.resetPrice(vueObject, data, lineNum)
        // 汇总
        this.sumPrice(vueObject, data)
      }
      // 税率修改时，级联不含税单价，两个金额，税额，并汇总金额税额到表头
      if (fieldName === 'taxRate') {
        this.resetPriceExTax(vueObject, data, lineNum)
        // 金额、税额
        this.resetPrice(vueObject, data, lineNum)
        // 汇总
        this.sumPrice(vueObject, data)
      }
      // 含税单价修改时，级联不含税单价，两个金额，税额，并汇总金额税额到表头
      if (fieldName === 'priceInTax') {
        // 级联价格，含税金额 = 结算数量 * 含税单价
        this.resetPriceExTax(vueObject, data, lineNum)
        // 金额、税额
        this.resetPrice(vueObject, data, lineNum)
        // 汇总
        this.sumPrice(vueObject, data)
      }
      // 不含税单价修改时，级联含税单价，两个金额，税额，并汇总金额税额到表头
      if (fieldName === 'priceExTax') {
        // 级联价格，含税金额 = 结算数量 * 含税单价
        this.resetPriceInTax(vueObject, data, lineNum)
        // 金额、税额
        this.resetPrice(vueObject, data, lineNum)
        // 汇总
        this.sumPrice(vueObject, data)
      }
    }
  },
  // 通过结算单位系数，计算主数量
  resetMainNumber(vueObject, data, line) {
    // 级联主数量，结算系数不为0时，主单位 = 结算数量 * 计算系数
    if (toNumber(data.body['saleItem'][line]['settlementCoefficient']) !== 0) {
      vueObject.$set(data.body['saleItem'][line], 'mainNumber', multiplication_StringResult(data.body['saleItem'][line]['settlementNumber'], data.body['saleItem'][line]['settlementCoefficient'], 2))
    }
  },
  // 计算结算单位数量
  resetSettlementNumber(vueObject, data, line) {
    // 级联主数量，结算系数不为0时，主单位 = 结算数量 * 计算系数
    if (toNumber(data.body['saleItem'][line]['settlementCoefficient']) !== 0) {
      vueObject.$set(data.body['saleItem'][line], 'settlementNumber', division_StringResult(data.body['saleItem'][line]['mainNumber'], data.body['saleItem'][line]['settlementCoefficient'], 2))
    }
  },
  // 含税单价
  resetPriceInTax(vueObject, data, line) {
    // 级联不含税单价，含税单价 = 不含税单价 * ((100 + 税率) / 100)
    vueObject.$set(data.body['saleItem'][line], 'priceInTax', multiplication_StringResult(data.body['saleItem'][line]['priceExTax'], division_NumberResult(addition_NumberResult(100, data.body['saleItem'][line]['taxRate']), 100), 2))
  },
  // 不含税单价
  resetPriceExTax(vueObject, data, line) {
    // 级联不含税单价，不含税单价 = 含税单价 / ((100 + 税率) / 100)
    vueObject.$set(data.body['saleItem'][line], 'priceExTax', division_StringResult(data.body['saleItem'][line]['priceInTax'], division_NumberResult(addition_NumberResult(100, data.body['saleItem'][line]['taxRate']), 100), 2))
  },
  // 计算两个金额及税额
  resetPrice(vueObject, data, line) {
    // 级联价格，含税金额 = 结算数量 * 含税单价
    vueObject.$set(data.body['saleItem'][line], 'totalPriceInTax', multiplication_StringResult(data.body['saleItem'][line]['settlementNumber'], data.body['saleItem'][line]['priceInTax'], 2))
    // 级联价格，不含税金额 = 结算数量 * 不含税单价
    vueObject.$set(data.body['saleItem'][line], 'totalPriceExTax', multiplication_StringResult(data.body['saleItem'][line]['settlementNumber'], data.body['saleItem'][line]['priceExTax'], 2))
    // 级联税额，税额 = 含税金额 - 不含税金额
    vueObject.$set(data.body['saleItem'][line], 'taxAmount', subtraction_StringResult(data.body['saleItem'][line]['totalPriceInTax'], data.body['saleItem'][line]['totalPriceExTax'], 2))
  },
  // 汇总价格
  sumPrice(vueObject, data) {
    // 汇总含税金额、不含税金额x
    let priceInTax = 0
    let priceExTax = 0
    for (const line in data.body['saleItem']) {
      // 汇总价格
      const item = data.body['saleItem'][line]
      priceInTax = addition_NumberResult(priceInTax, item['totalPriceInTax'])
      priceExTax = addition_NumberResult(priceExTax, item['totalPriceExTax'])
    }
    // 表头赋值
    vueObject.$set(data.head, 'priceInTax', toString(priceInTax, 2))
    vueObject.$set(data.head, 'priceExTax', toString(priceExTax, 2))
    vueObject.$set(data.head, 'taxAmount', toString(priceInTax - priceExTax, 2))
  }
}
